package com.gxa.weixing.pc.service.impl;

import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson.JSON;
import com.gxa.weixing.core.common.ExceptionCode;
import com.gxa.weixing.core.exception.BusinessException;
import com.gxa.weixing.core.pojo.Goods;
import com.gxa.weixing.core.pojo.GoodsDetail;
import com.gxa.weixing.core.util.VerifyParamUtil;
import com.gxa.weixing.pc.mapper.GoodsDetailMapper;
import com.gxa.weixing.pc.mapper.ShopInventoryMapper;
import com.gxa.weixing.pc.service.GoodsDetailService;
import com.gxa.weixing.pc.service.GoodsService;
import com.gxa.weixing.pc.service.ShopInventoryService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;

/**
 * @author lijianmin
 * @date 2022/01/07  17:54:31
 */
@Service("shopInventoryService")
@Transactional(rollbackFor = Throwable.class)
public class ShopInventoryServiceImpl implements ShopInventoryService {

    @Resource
    private ShopInventoryMapper shopInventoryMapper;

    @Resource
    private GoodsService goodsService;

    @Resource
    private GoodsDetailMapper goodsDetailMapper;

    /**
     * 修改门店库存的方法
     *
     * @param map 修改休息
     * @return 返回是否成功
     */
    @Override
    public void updateShopInventory(Map<String, Object> map) throws BusinessException {
        // 进行是否为空校验
        VerifyParamUtil.checkParams(map);
        Integer inventoryUp = VerifyParamUtil.integerVerifyParam(map.get("inventory"));

        // 获取商品编号
        Long id = VerifyParamUtil.longVerifyParam(map.get("id"));
        // 将map转换为JSON字符串
        String jsonString = JSONUtils.toJSONString(map);
        // 将JSON字符串转换为对象
        Goods goods = JSON.parseObject(jsonString, Goods.class);
        GoodsDetail goodsDetail = JSON.parseObject(jsonString, GoodsDetail.class);
        // 获取当前商品的原本库存
        Integer originallyInventory = goodsDetailMapper.selectByGoodsId(id).getInventory();
        goodsDetail.setInventory(inventoryUp + originallyInventory);

        // 根据商品编号查找到商品详情编号
        goodsDetail.setId(goodsDetailMapper.selectByGoodsId(id).getId());
        // 将商品编号装入商品详情中
        goodsDetail.setGoodsId(id);

        System.out.println("加载后:  ");
        System.out.println(goodsDetail);
        System.out.println("***********Map转换为对象*************");

        // 进行修改操作
        Integer goodsUpdate = goodsService.updateById(goods);
        int goodsDetailUpdate = goodsDetailMapper.updateByPrimaryKeySelective(goodsDetail);

        // 进行校验 如果返回值不正确 则抛出异常进行回滚
        if (goodsUpdate <= 0 || goodsDetailUpdate <= 0) {
            throw new BusinessException(ExceptionCode.UPDATE_ERROR);
        }
        // Goods goods = new Goods();
        // // 商品编号
        // goods.setId(id);
        // // 商品名称
        // goods.setName(VerifyParamUtil.stringVerifyParam(map.get("name")));
        // // 原价格 删除线
        // goods.setPrePrice(VerifyParamUtil.bigDecimalVerifyParam(map.get("prePrice")));
        // // 销售价格
        // goods.setPrice(VerifyParamUtil.bigDecimalVerifyParam(map.get("price")));
        // // 采购价格
        // goods.setPurchasePrice(VerifyParamUtil.bigDecimalVerifyParam(map.get("purchasePrice")));
        // // 商品封面
        // goods.setImg(VerifyParamUtil.stringVerifyParam(map.get("img")));
        // // 商品描述
        // goods.setDesc(VerifyParamUtil.stringVerifyParam(map.get("desc")));
        // // 商品状态
        // goods.setState(VerifyParamUtil.integerVerifyParam(map.get("state")));
        // Integer goodsUpdate = goodsService.updateById(goods);
        // GoodsDetail goodsDetail = new GoodsDetail();
        // goodsDetail.setId(goodsDetailMapper.selectByGoodsId(id).getId());
        // // 商品编号
        // goodsDetail.setGoodsId(id);
        // // 商品规格
        // goodsDetail.setUnit(VerifyParamUtil.stringVerifyParam(map.get("unit")));
        // // 商品单价
        // goodsDetail.setWeight(0.0D);
        // // 商品总库存
        // goodsDetail.setInventory(0);
        // // 商品已售量
        // goodsDetail.setSold(0);
        // // 商品虚拟已售量
        // goodsDetail.setSoldVirtual(0);
        // // 商品剩余库存
        // goodsDetail.setSurplusInventory(0);
        // // 商品详细介绍
        // goodsDetail.setIntroduce("");
        // // 商品示例图
        // goodsDetail.setSampleImg("");
        // // 供应商编号
        // goodsDetail.setSupplierId(0L);
        // // 添加时间
        // goodsDetail.setAddTime(new Date());
        // // 推广
        // goodsDetail.setPromotion(false);
        // // 推广语
        // goodsDetail.setPromotionStatement("");
        // // 门店编号
        // goodsDetail.setShopId(0L);
        // // 门店销售状态
        // goodsDetail.setShopSalesState(false);
        // // 门店消耗 自耗
        // goodsDetail.setShopConsume(0);
        // // 修改时间
        // goodsDetail.setUpdateTime(new Date());

    }

    /**
     * 删除门店库存的方法
     *
     * @param id 删除门店库存的编号
     * @return 返回是否成功
     */
    @Override
    public void deleteShopInventory(Long id) throws  BusinessException {
        // 进行是否为空校验
        VerifyParamUtil.checkParams(id);

        // 进行删除操作
        Integer integer = shopInventoryMapper.deleteShopInventory(id);
        // 进行验证 如果返回值不正常则抛异常
        if (integer == null || integer <= 0) {
            throw new BusinessException(ExceptionCode.DELETE_ERROR);
        }
    }

    /**
     * 添加门店库存的方法
     *
     * @param map 添加门店库存的信息
     * @return 返回是否成功
     */
    @Override
    public void addShopInventory(Map<String, Object> map) throws BusinessException {
        // 进行是否为空校验
        VerifyParamUtil.checkParams(map);

        // 将map转换为JSON字符串
        String jsonString = JSONUtils.toJSONString(map);
        // 将JSON字符串转换为实体类
        Goods goods = JSON.parseObject(jsonString, Goods.class);

        GoodsDetail goodsDetail = JSON.parseObject(jsonString, GoodsDetail.class);


        // 进行添加商品操作
        Goods goodsAdd = goodsService.insert(goods);
        // 如果商品编号为空 则抛出异常进行回滚
        if (goodsAdd.getId() == null) {
            throw new BusinessException(ExceptionCode.ADD_ERROR);
        }

        // 将添加返回的商品编号写入商品详情对象中
        goodsDetail.setGoodsId(goodsAdd.getId());
        // 添加时间设为默认
        goodsDetail.setAddTime(new Date());
        // 商品已售设为初始值0
        goodsDetail.setSold(0);
        // 剩余库存同步跟随总库存
        goodsDetail.setSurplusInventory(goodsDetail.getInventory());
        // 修改时间同步当前时间
        goodsDetail.setUpdateTime(new Date());
        // 进行添加商品详情操作
        int insert = goodsDetailMapper.insert(goodsDetail);
        // 如果返回值小于1 则抛出异常进行回滚
        if (insert <= 0) {
            throw new BusinessException(ExceptionCode.ADD_ERROR);
        }
    }
}
